pub fn odd_fibnacci_sum(threshold: u32) -> u32 {
    _odd_fibnacci_sum(threshold)
}

// 斐波那契数列具有一个性质，偶 奇 奇， 偶 奇 奇，这样的分块排序，比如0 1 1，2 3 5，8 13 ...
// 又因为前面分块的奇数和等于下一块的偶数，从第2块起把偶数加起来
// 最后我们再去判断最后一块有几个奇数
fn _odd_fibnacci_sum(threshold: u32) -> u32 {
    assert!(threshold >= 2);
    let mut a = 0u32; // a是前面的数
    let mut b = 1u32; // b是后面的数
    let mut index_count = 1u32; // 索引计数0-2，初始化为1,表示0 1 1当前的索引计数指向了数值1的这个位置, a和b相加一次，index_count向后移动一次
    let mut result_count = 0u32; // 最终的和
    loop {
        let c = a + b; // 计算出下一个数
        if c >= threshold {
            // 如果超出了范围就退出循环,退出之前，通过index_count检查需要加的奇数，
            // 如果index_count = 1的话，此次循环得到的c是奇数，c前面的数字是b，且是一个奇数。
            // 如果index_count是2的话，此次循环得到的c是偶数，前面的数字是b和a，且都是奇数，需要加上去
            // 如果index_count是0的话，那代表了这次得到的c是奇数，c前面的偶数已经相加了，不需要考虑了
            if index_count == 1u32 {
                result_count += b;
            }

            if index_count == 2u32 {
                result_count += a + b;
            }
            break;
        }

        index_count += 1;
        if index_count % 3 == 0 {
            // 此次得到的c是一个偶数，相加
            index_count = 0;
            result_count += c;
        }
        a = b;
        b = c;
    }

    result_count
}
